package main

import (
	"net/http"
	"github.com/gin-gonic/gin"
    "fmt"
	"os/exec"
    "strconv"
	"encoding/json"
	"flag"
	"io/ioutil"
	"log"
	"os"
	"os/signal"
	"syscall"

)

var (
	config      Config
	ch_trans    chan bool
	press_count int = 0
)

// Config 配置
type Config struct {
	Client *ClientConfig `json:"client"`
	Server *ServerConfig `json:"server"`
}

// ClientConfig 客户端配置
type ClientConfig struct {
	Name       string `json:"name"`       // 名称
	Addr       string `json:"addr"`       //服务端地址
	VerifyCode string `json:"verifycode"` //verify code
}

// ServerConfig 服务端配置
type ServerConfig struct {
	Name string `json:"name"`  // 名称
	Port int    `json:"port"`  //服务端口
	Sdir string `json:"s_dir"` //服务器文件夹
	Cdir string `json:"c_dir"` //临时接收文件夹
}

// 定义接收JSON数据的结构体
type Login struct {
	User     string `json:"user" binding:"required"`    // 用户名，必填字段
	Password string `json:"password" binding:"required"` // 密码，必填字段
}

type UserInfo struct {
	Name  string `json:"name"`
	Age   int    `json:"age"`
	Email string `json:"email"`
}

// Strategy 结构体
// {'strategy':'MA1','idx':1,'time':get_now(),'action': action,'zqdm': stock,'qty': num, 'trade_time':str(context.current_dt),'token':123}
type TradeUnit struct {
    Strategy    string `json:"strategy"`   //策略名称
    Idx         int    `json:"idx"`        //id 选 
    Time        string `json:"time"`       //执行时间
    Action      string `json:"action"`     //buy or sell
    Zqdm        string `json:"zqdm"`       //标的代码
    Qty         int    `json:"qty"`        //数量
    TradeTime   string `json:"trade_time"` //交易时间
    Token       int    `json:"token"`      //token
}



func server(){
	// 1. 创建路由引擎
	r := gin.Default()

	// 2. 绑定路由规则，定义处理函数
	// 处理JSON POST请求
	r.POST("/stock", func(c *gin.Context) {
		// 声明接收的变量
		//var login Login
       
        
        var trade []TradeUnit //定义一个tradeunit切片
        //s := string(msg.Data)
        
        //err := json.Unmarshal([]byte(s), &trade)
        //if err != nil {
        //    panic(err)
        //}
        
        //fmt.Printf("%T\n", trade)
        //fmt.Printf("%s\n", trade)
		
		// 将请求的body中的数据，自动按照json格式解析到结构体
		if err := c.ShouldBindJSON(&trade); err != nil {
			// 返回错误信息
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
			return
		}
		
		// 返回成功信息
		c.JSON(http.StatusOK, gin.H{"status": "handle success"})
        
        
        // 打印结果
        for _, t := range trade {
            fmt.Printf("stock: %s action: %s num: %d trade_time: %s\n", t.Zqdm, t.Action, t.Qty, t.TradeTime)
            result := fmt.Sprintf("strategy_%s|zqdm_%s|action_%s|qty_%d|time_%s|tradetime_%s|token_%d",t.Strategy, t.Zqdm, t.Action, t.Qty, t.Time, t.TradeTime, t.Token)
            fmt.Println(result) // 输出: Hello 42
            
            //go func() {
                cmd := exec.Command("python", "gp.py", result)
                // // 不需要cmd.Run()
                out, err := cmd.Output()
                if err != nil {
                    fmt.Println("执行命令出错: ", err)
                    //return
                } else {
                    fmt.Println("获取命令执行结果: ", string(out))
                }
            //}()
        }
	})

	// 返回JSON数据的GET请求
	r.GET("/user", func(c *gin.Context) {
		user := UserInfo{
			Name:  "张三",
			Age:   25,
			Email: "zhangsan@example.com",
		}
		
		// 返回JSON数据
		c.JSON(http.StatusOK, user)
	})

	// 3. 启动服务，默认在 0.0.0.0:8080 启动服务
    port := ":" + strconv.Itoa(config.Server.Port)
	r.Run(port)
    
}

func main() {
    
    cfg := flag.String("f", "config.json", "Config file")
	flag.Parse()
	/*  载入 配置 */
	configBytes, err := ioutil.ReadFile(*cfg)
	if err != nil {
		panic(err)
	}

	err = json.Unmarshal(configBytes, &config)
	if err != nil {
		panic(err)
	}

	psignal := make(chan os.Signal, 1)
	//ctrl+c -> signint, kill -9 -> signkill
	signal.Notify(psignal, syscall.SIGINT, syscall.SIGKILL)

	ch_trans = make(chan bool, 1)

	//go serve()
	go server()

	<-psignal
	log.Println("Bye!")

}